package net.ib.mtalk.service;

import net.ib.mntalk.protocol.Common;
import net.ib.mntalk.protocol.Common.NotificationInfo;
import net.ib.mtalk.network.NetResultReceiver;
import net.ib.mtalk.network.NetResultReceiver.Receiver;
import net.ib.mtalk.network.serverapi.Ping;
import net.ib.mtalk.service.ViewChangeHandler.ViewChangeCallback;
import net.ib.mtalk.util.MTalkLogWriter;
import android.content.Context;
import android.os.Handler;

public class ReadmarkReceivedHandler extends SelectResultHandler {

	private Handler mHandler;
	private NotificationInfo mNotiInfo;
	
	/**
	 * 한 개의 NotificationInfo에 대하여 객체가 한 개씩 생성된다.
	 * @param notificationInfo {@link Common#READMARK_RECEIVED}에 해당하는 객체
	 */
	ReadmarkReceivedHandler(Context context, NotificationInfo notificationInfo) {
		super(context, notificationInfo);
		mNotiInfo = notificationInfo;
	}

	@Override
	protected void onWork(Handler handler) {
		/*
		 * 여기에서 작업을 시작하게 된다.
		 * */
		finish();
		doMyJob(handler);
	}
	
	/**
	 * 핑을 보내는 예제.
	 * @param handler
	 */
	private void doMyJob(Handler handler) {
		/*
		 * 콜백의 구현은 어떤 형태여도 좋으나, AsyncNetTask 등을 이용한 스레드 분기를 사용하지 말 것.
		 * 왜냐하면 이미 이 메소드의 호출은 메인 스레드가 아닌 서비스 스레드에서 이루어지며,
		 * 순차 작업이 보장되어야 안전하기 때문이다.
		 * */
		Ping.ping(new byte[]{0,0,0,0}, new NetResultReceiver(handler, new Receiver() {
			
			@Override
			public void onNetResult(int resultCode, Object sentObject, Object receivedObject) {
				MTalkLogWriter.i("Example netResult");
				finishMyJob();
			}
			
			@Override
			public void onNetError(int resultCode, Object sentObject) {
				MTalkLogWriter.i("Example netError");
				finishMyJob();
			}
		}));
	}

	/**
	 * 작업을 마치는 예제.
	 */
	private void finishMyJob() {
		/*
		 * finish() 에 대한 호출은 반드시 이루어져야 한다.
		 * 이것을 보장하기 위해 네트워크 요청시 짧은 유통기한 지정 등을 고려할 수 있다.
		 * */
		finish();	// 작업을 끝낼 때 이 함수를 반드시 한 번 불러줘야 함.
	}
	
	private NetResultReceiver mCallback = null;
	
	protected NetResultReceiver makeNewCallback() {
		mCallback = new NetResultReceiver(mHandler, new ReadmarkCallback());	// 준비됐으니 새 리시버를 만들어준다.
		return mCallback;
	}
	
	class ReadmarkCallback implements NetResultReceiver.Receiver {

		@Override
		public void onNetResult(int resultCode, Object sentObject,
				Object receivedObject) {
			finishMyJob();
		}

		@Override
		public void onNetError(int resultCode, Object sentObject) {
			finishMyJob();
		}
		
	}
}
